Apple II
Technical Notes
_____________________________________________________________________________
                                                  Developer Technical Support


UniDisk 3.5
#4:    Accessing Macintosh Disks

Revised by:    Matt Deatherage                                  November 1988
Written by:    Mike Askins                                           May 1985

This Technical Note formerly discussed drive-specific SmartPort calls.  These 
calls are now documented in the Apple IIGS Firmware Reference.  This Note now 
describes how to access Macintosh disks from a UniDisk 3.5 disk drive, as this 
information was not documented in the manual.
_____________________________________________________________________________


Macintosh Disk Access

The disk data format used in the UniDisk 3.5 is essentially identical to that 
used for Macintosh disks.  There are three notable differences between the two 
formats:

o    Macintosh blocks are 524 bytes; UniDisk 3.5 blocks are 512 bytes.
o    Macintosh MFS disks are single sided; UniDisk 3.5 disks are double 
     sided.  (Macintosh HFS disks are double sided.)
o    The Macintosh uses a 2:1 physical block interleave; the UniDisk 
     3.5 uses a 4:1 interleave.


Accessing Blocks on a Macintosh Disk

Reading from a Macintosh disk is accomplished with the use of the READ command 
(as opposed to the READBLOCK command, which enforces 512 byte data.)  A call 
to load block zero from the Macintosh disk in Unit #1 into memory at $2000 
would look like this:

MacRead    JSR    Dispatch                ;Normal SmartPort Entry point
           DFB    $08                     ;Character READ command code
           DW     Cmd_List                ;The parameter list
           BCS    Error                   ;Optional error handling...
           ...
Cmd_List   DFB    $04                     ;CharRead has four parameters
           DFB    $01                     ;Unit number
           DW     $2000                   ;Buffer address
           DW     524                     ;Always transfer 524 bytes
           DFB    $00                     ;Block (lo)
           DFB    $00                     ;Block (med)
           DFB    $00                     ;Block (hi) 


Writing to a Macintosh disk is accomplished with the use of the WRITE command.  
A call to write block zero to the Macintosh disk in Unit #1 with data at 
memory location $2000 would look like this:

MacWrite   JSR    Dispatch                ;Normal SmartPort Entry point
           DFB    $09                     ;Character WRITE command code
           DW     Cmd_List                ;The parameter list
           BCS    Error                   ;Optional error handling...
        
The Cmd_List is the same as in the READ example.


Formatting Macintosh Disks

The formatting routine in the UniDisk 3.5 firmware can format single- or 
double-sided disks of variable physical block interleave.  The parameters 
controlling the interleave and the number of disk sides are located in the 
controller's zero page and are set to defaults whenever the INIT call is 
issued to SmartPort.  These parameters can be altered by using the 
SET_DOWN_ADR and DOWNLOAD subcalls of the CONTROL call.  Once altered, the 
FORMAT call uses these values in the formatting process.  These zero page 
locations and their values are detailed below:

Parameter      Location                 Values
Interleave     $0062           $02 = Mac,    $04 = UniDisk 3.5
DoubleSided    $0063           $00 = Single, $80 = Double-sided

The following code example formats the media in Unit #1 as a Macintosh disk:

MacFormat  JSR    Dispatch                ;Set address to patch interleave
           DFB    $04                     ;Control call (Set_Down_Adr)
           DW     Cmd_ListA               ;Parameter List
           BCS    Error
;
           JSR    Dispatch                ;Now patch the interleave byte
           DFB    $04                     ;Control call (DOWNLOAD)
           DW     Cmd_ListB               ;Parameter List
           BCS    Error
;
           JSR    Dispatch                ;Set address to patch single sided
           DFB    $04                     ;Control call (Set_Down_Adr)
           DW     Cmd_ListC               ;Parameter List
           BCS    Error
;
           JSR    Dispatch                ;Now patch the single sided byte
           DFB    $04                     ;Control call (DOWNLOAD)
           DW     Cmd_ListD               ;Parameter List
           BCS    Error
;
           JSR    Dispatch                ;Finally...
           DFB    $03                     ;This is the actual format call
           DW     Cmd_ListE               ;Parameter List
           BCS    Error
;
           RTS

The parameter lists are as follows:

Cmd_ListA  DFB    $03                     ;All control calls are 3 parms long
           DFB    $01                     ;Unit #1
           DW     Ctrl_ListA              ;This has the interleave address
           DFB    $06                     ;Set_Down_Adr control code

Ctrl_ListA DW    $02                      ;Two bytes for download address
           DW    $0062                    ;Interleave address

Cmd_ListB  DFB    $03                     ;All control calls are 3 parms long
           DFB    $01                     ;Unit #1
           DW     Ctrl_ListB              ;This has the interleave value
           DFB    $07                     ;Download control code

Ctrl_ListB DW     $01                     ;Two bytes for download address
           DFB    $02                     ;Mac Disk Interleave value

Cmd_ListC  DFB    $03                     ;All control calls are 3 parms long
           DFB    $01                     ;Unit #1
           DW     Ctrl_ListC              ;This has the sides byte address
           DFB    $06                     ;Set_Down_Adr control code

Ctrl_ListC DW    $02                      ;Two bytes for download address
           DW    $0062                    ;Interleave address

Cmd_ListD  DFB    $03                     ;All control calls are 3 parms long
           DFB    $01                     ;Unit #1
           DW     Ctrl_ListD              ;This has the sides value
           DFB    $07                     ;Download control code

Ctrl_ListD DW     $01                     ;Two bytes for download address
           DFB    $00                     ;Value for single sided disk

Ctrl_ListE DFB    $01                     ;Format call has just one parameter
           DFB    $01                     ;Unit number

Note:    You may encounter difficulties when switching 400K single-
sided disks and 800K double-sided disks in the same drive.  STATUS 
requests for the number of blocks on the disk in the drive are 
valid for the disk last accessed.  Thus, when you READ from an 
800K disk, eject it, and insert a 400K disk, a STATUS call will 
reveal a size of 800K until a READ or WRITE command is issued.  
Applications which intend to handle both 800K and 400K disks 
should do a READ before each STATUS call.


Further Reference
o    Apple IIGS Firmware Reference
o    Apple IIc Technical Reference Manual

